package variable

/**
 * 闭包的使用
 * @author chensj(chensj@winning.com.cn)
 * @date 2019-09-21 15:17
 */
//闭包使用
//- 与基本类型的集合使用
int x = 10
// upto 用来求num的阶乘
static int fab(int num) {
    int result = 1;
    1.upto(num, { n -> result *= n })
    return result;
}

def result = fab(x)
println(result)
// downto 用来求num的阶乘
static int fab2(int num) {
    int result = 1;
    num.downto(1) {
        n -> result *= n
    }
    return result
}

result = fab2(x)
println(result)
// times 方法，不能用来获取阶乘，源码中index从0开始
static int count(num) {
    int result = 0
    num.times {
        n -> result += n
    }
    return result
}

result = count(x)
println(result)

//- 与String结合使用

String str = 'the 2 and 3 is 5'
// each 字符串的遍历
// 返回值就是调用者本身
str.each {
    String item -> print(item.multiply(2))
}

// 通过find 来查找符合条件的第一个，闭包必须计算结果必须是一个boolean的值
result = str.find {
        // 获取第一个是数字的值
    String s -> s.isNumber()
}

println(result)

// findAll 获取全部符合要求的值，闭包必须计算结果必须是一个boolean的值
result = str.findAll {
    String s -> s.isNumber()
}
println(result.toListString())

// any 判断是否包含某个值 只要一个满足条件就会返回true
result = str.any {
    String s -> s.isNumber()
}
println(result)

// every  判断是否每一项都符合要求 只要一个不满足条件就会返回false
result = str.every {
    String a -> a.isNumber()
}
println(result) // false
//- 与数据结构结合使用

//- 与文件等结合使用
